package cn.yedong.basic.intercepter;

import cn.yedong.basic.jwt.JwtUtils;
import cn.yedong.basic.jwt.LoginData;
import cn.yedong.basic.jwt.Payload;
import cn.yedong.basic.jwt.RsaUtils;
import io.jsonwebtoken.ExpiredJwtException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.security.PublicKey;
import java.util.concurrent.TimeUnit;

/**
 * 后端拦截器
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {
//    @Autowired
//    private RedisTemplate redisTemplate;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获取请求头
        String token = request.getHeader("token");//jwt token    //9d6efc29-24a9-4799-a3ff-ce7ff301157f
        if(token != null){
            //使用jwt方案
            try {
                PublicKey publicKey = RsaUtils.getPublicKey(RsaUtils.class.getClassLoader().getResource("auth_rsa.pub").getFile());
                JwtUtils.getInfoFromToken(token, publicKey, LoginData.class);
                return true;//没有刷新过期时间
            } catch (ExpiredJwtException e) {
                e.printStackTrace();
                //告诉浏览器我响应的是JSON数据，编码是utf-8，前端接收之后会自己转换成JSON对象
                response.setContentType("application/json;charset=utf-8");
                //直接向前端传递JSON格式字符串，先在{}中写好，放进去，idea会自动解析
                response.getWriter().println("{\"success\":false,\"msg\":\"timeOut\"}");
                return false;//不会走controll
            }

            //从Redis获取登陆信息
//            Object obj = redisTemplate.opsForValue().get(token);
//            if(obj != null){//登陆过，还没有过期
//                //刷新过期时间
//                redisTemplate.opsForValue().set(token,obj,30, TimeUnit.MINUTES);
//                //放行
//                return true;
//            }
        }
        //2.判断token，如果为null - 直接拦截 响应前端 - 跳转到登录页面
        //4.如果登录信息为null - 过期了 直接拦截 响应前端 - 跳转到登录页面

        //最终目的是跳转登陆界面，后端不做跳转页面处理，响应json数据给前端，前端去判断再跳转页面
        //告诉浏览器我响应的是JSON数据，编码是utf-8，前端接收之后会自己转换成JSON对象
        response.setContentType("application/json;charset=utf-8");
        //直接向前端传递JSON格式字符串，先在{}中写好，放进去，idea会自动解析
        ///

//        response.getWriter().println("{\"success\":false,\"msg\":\"noLogin\"}");

//        return false;
        return true;//正常返回false，测试放行改为true
    }
}
